<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>补充---闭包</title>
</head>
<body>

<script>
    // 把函数作为返回值，暴露给外部使用
    // 函数返回值由return 决定，默认是undefined
    // 作用域：全局作用域，局部作用域(即：函数作用域)
    // 局部作用域可访问全局作用域的变量；全局作用域无法访问局部的变量
    var a = 10                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
    function f1(){
        var b = 5
        console.log(a)   // 10

        function f2(){
            var c = 15
            console.log(b)  // 5
        }
        f2()
        console.log(c)  // 错误
    }
    //    f1()
    //    console.log(b) // 错误

    function func(){
        var uname = 'yanhan'
        function showName(){
            console.log(uname)
        }
        // eshowNam函数在执行前被返回
        return showName
    }
    // func函数的返回值是内嵌函数名
    // 注意：funcName()才是执行函数，funcName只是一个函数名称
    var myFunc = func()
    myFunc()  // 执行函数

    // 函数捕获它所在的外部作用域的现象叫做闭包， closuers
    // 闭包的作用：1.可保护数据不被篡改；2.可从外部读取内部变量
    // 函数也是对象，因此函数可作为返回值使用


    var name = "window对象"
    var obj = {
        name:'object对象',
        getName:function(){
             return function(){
            	return console.log(this.name)
            }
        }
    }
    console.log( obj.getName() )   // window对象
    //    console.log( obj.getName() )  // function(){}
    //    var dd = obj.getName()
    //    console.log(dd)
    //    console.log( dd() )
    var name = "window对象"
    var obj = {
        name:'object对象',
        getName:function(){
            var that = this
            return function(){
                return that.name
            }
        }
    }
    console.log( obj.getName()() )  // object对象
</script>
</body>
</html>